import globals from "globals";
import pluginJs from "@eslint/js";
import tseslint from "typescript-eslint";

/** @type {import('eslint').Linter.Config[]} */
export default [
  {
    // 通常在顶层配置 ignores，而不是在配置数组中
    // ignores: [...], // 移到顶层或命令行参数中
    // 忽略语法检测的目录
    ignores: [
      // 忽略构建目录
      "dist",
      // 忽略包目录
      "node_modules",
      // 忽略 js 文件夹的非标准 ts 语法文件
      "*/**/js/*"],
  },
  {
    files: ["**/*.{js,mjs,cjs,ts}"],
    rules: {
      // 强制要求分号结尾
      semi: ["error", "always"],
      // 强制使用 const, let, 或 var，避免使用未声明的变量
      "no-undef": "error",
      // 强制使用 const 声明变量，如果变量在声明后没有重新赋值
      "prefer-const": [
        "error",
        {
          destructuring: "all",
          ignoreReadBeforeAssign: true,
        },
      ],
      // 禁止 let 和 var，只允许使用 const（如果你想要更严格的变量声明）
      "no-var": "error",
      // 强制块级作用域
      "block-scoped-var": "error",
      // 禁止未使用的变量
      "no-unused-vars": ["error", { args: "after-used", argsIgnorePattern: "^_", vars: "all", varsIgnorePattern: "^_" }],
      // 禁止在函数内部重新声明参数
      "no-redeclare": "error",
      // 强制函数表达式始终有名称（有助于调试）
      "func-names": "error",
      // 禁止在条件语句中使用赋值表达式（避免错误）
      "no-cond-assign": "error",
      // 禁止修改 const 声明的变量
      "no-const-assign": "error",
      // 强制数组和对象的字面量键按字典序排序
      // "sort-keys": ["error", "asc", { caseSensitive: false, natural: true }], // 可选，但有助于保持代码一致性
      // 强制使用严格相等（=== 和 !==），而不是宽松相等（== 和 !=）
      "eqeqeq": ["error", "always", { null: "ignore" }],
      // 禁止不必要的三元运算符
      "no-unneeded-ternary": "error",
      // 禁止在 return、throw、continue 和 break 语句后使用不必要的括号
      "no-extra-parens": ["error", "all", {
        conditionalAssign: true,
        nestedBinaryExpressions: false,
        returnAssign: true,
        ignoreJSX: "multi-line",
        enforceForArrowConditionals: false,
      }],
      // 其他你想要的严格规则...
    },
  },
  { languageOptions: { globals: globals.browser } },
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  {
    rules: {
      // 这个配置一定要放到最后，否则不生效
      // 忽略使用 require 语法警告
      "@typescript-eslint/no-require-imports": "off",
    }
  }
];
